package com.omi.iberolactalpreventa;

import java.util.Calendar;
import java.util.GregorianCalendar;
import android.database.Cursor;

public class GestionDescuentos {

	String Tipo;
	String Codigo;
	String Tipo_venta;
	String Codigo_venta;
	String Fecha_inicial;
	String Fecha_final;
	String Dto_linea="0";
	String Dto_oferta="0";
	String Imp_fijo_oferta="0";
	String Porc_Dto_oferta="0";
	String Dto_Promo="0";
	String Imp_fijo_Promo="0";
	String Porc_Dto_promo="0";
	String precio_neto="0";
	String Metodo_calc_dto_linea;
	String Dto_Final="0";
	boolean DtoEnCascada;
	boolean DtoEncontrado;
	Cursor c;
	
	public GestionDescuentos()
	{
		InitDto();
	}


    public void GetDto(String pCodCliente,String pCodProducto,String pFecha,String pPrecioUdKg)
    {
        InitDto();
        SelectDto(pCodCliente, pCodProducto, pFecha);
        CalcDtoFinal(pCodCliente, pCodProducto, pPrecioUdKg);
    }
    
    public void InitDto()
    {
        Tipo = "";
        Codigo = "";
        Tipo_venta = "";
        Codigo_venta = "";
        Fecha_inicial = "";
        Fecha_final = "";
        Dto_linea = "0";
        Dto_oferta = "0";
        Imp_fijo_oferta = "0";
        Porc_Dto_oferta = "0";
        Dto_Promo = "0";
        Imp_fijo_Promo = "0";
        Porc_Dto_promo = "0";
        precio_neto = "0";
        Dto_Final = "0";
        Metodo_calc_dto_linea = "";
        DtoEnCascada = false;
        DtoEncontrado = false;
    }
    
    private void SelectDto(String pCodCliente,String pCodProducto,String pFecha)
    {
        String GrupoDtoClie="0";
        String GrupoDtoProd="0";

        String consulta;
        GregorianCalendar now= new GregorianCalendar();
        c = Modulebase.db.ejecutarSelect(new String[]{"Grupo_dto_cliente"}, "Cliente", "Cod_Cliente=?",new String[]{pCodCliente});
        
        if(c!=null && c.moveToFirst())
        {
        	GrupoDtoClie= c.getString(0);
        }
        
        c = Modulebase.db.ejecutarSelect(new String[]{"Grupo_dto_producto"},"Producto","Numero=?",new String[]{pCodProducto});
        
        if(c!=null && c.moveToFirst())
        {
        	GrupoDtoProd = c.getString(0);
        }
        
        consulta = "SELECT Tipo,CODIGO,TIPO_VENTA,CODIGO_VENTA,FECHA_INICIAL,FECHA_FINAL,DTO_LINEA,DTO_OFERTA,IMPORTE_FIJO_OFERTA,DTO_PROMOCION,IMPORTE_FIJO_PROMOCION,PRECIO_NETO_UDKG,METODO_CALC_DTO_LINEA,DTO2_EN_CASCADA FROM Dto_Clie_Prod WHERE (Fecha_inicial<='" + now.get(Calendar.DAY_OF_MONTH)+"/"+now.get(Calendar.MONTH) + "/"+now.get(Calendar.YEAR)+"') AND (Fecha_final>='" + now.get(Calendar.DAY_OF_MONTH)+"/"+now.get(Calendar.MONTH) + "/"+now.get(Calendar.YEAR)+"') AND ((Codigo='') OR (Codigo='" + GrupoDtoProd + "') OR (Codigo='" + pCodProducto + "')) AND ((Codigo_venta='') OR (Codigo_venta='" + GrupoDtoClie + "') OR (Codigo_venta='" + pCodCliente + "')) ORDER BY Tipo,Codigo,Tipo_venta,Codigo_venta,Fecha_inicial DESC";
        c = Modulebase.db.ejecutarRawQuery(consulta);
        
        if(c!=null && c.moveToFirst())
        {
            DtoEncontrado = true;
            Tipo = c.getString(0);
            Codigo = c.getString(1);
            Tipo_venta = c.getString(2);
            Codigo_venta = c.getString(3);
            Fecha_inicial = c.getString(4);
            Fecha_final = c.getString(5);
            Dto_linea = c.getString(6);
            Dto_oferta = c.getString(7);
            Imp_fijo_oferta = c.getString(8);
            Dto_Promo = c.getString(9);
            Imp_fijo_Promo = c.getString(10);
            precio_neto = c.getString(11);
            Metodo_calc_dto_linea = c.getString(12);

            if(c.getString(13).equals("1"))
            {
                DtoEnCascada = true;
            }
            else
            {
                DtoEnCascada = false;
            }
        }
        else
        {
            InitDto();
        }
    }
        
    public void CalcDtoFinal(String pCodCliente,String pCodProducto,String pPrecioUdKg)
    {
        String AuxDtoLin="";
        String DtoOferta1="0";
        String DtoOferta2="0";
        String DtoPromo1="0";
        String DtoPromo2="0";
        String AuxString1="";
        String AuxString2="";
        String vLMetodoCalcDto="";

        boolean vLCalcDtoCascada=false;

        if(!DtoEncontrado)
        {
            GetCamposEnConfigPrev(vLMetodoCalcDto, vLCalcDtoCascada);
        }
        else
        {
            vLMetodoCalcDto = Metodo_calc_dto_linea;
            vLCalcDtoCascada = DtoEnCascada;
        }

        // Limpiando el dto. linea conseguimos que el dto ofertar se calcule sobre la base
        // (el precio ud/kg indicado por la tarifa) y no como en los otros caso que los dtos 2 y 3 (oferta y promocion)
        // se calculan de precio ud/kg una vez quitado el 1 (Dto. linea)

        if(vLMetodoCalcDto.equals("Dto. oferta * Dto. promoción * Dto. línea"))
        {
        	AuxDtoLin = Dto_linea;
            Dto_linea = "0";
        }
        else if(vLMetodoCalcDto.equals("Dto. oferta + Dto. promoción + Dto. línea"))
        {
            AuxDtoLin = Dto_linea;
            Dto_linea = "0";
        }
        
        if(!precio_neto.equals("0"))
        {
            if(!pPrecioUdKg.equals("0"))
            {
                String vLprecioNetoDec;
                vLprecioNetoDec = precio_neto;
                DtoOferta1 = ((Float.parseFloat(pPrecioUdKg) - Float.parseFloat(vLprecioNetoDec)) / Float.parseFloat(pPrecioUdKg)) * 100+"";
                DtoOferta1 = Modulebase.Redondear(DtoOferta1, 5);
            }
            else
            {
            	DtoOferta1 = "0";
            }
      

            String AuxPrecNeto;
            AuxPrecNeto = precio_neto;
            Imp_fijo_oferta = Float.parseFloat(pPrecioUdKg) - Float.parseFloat(AuxPrecNeto)+"";
            Imp_fijo_oferta = Modulebase.Redondear(Imp_fijo_oferta, 5);
            DtoOferta2 = "0";
            DtoPromo1 = "0";
            DtoPromo2 = "0";
        }
        else
        {
            if (!Imp_fijo_oferta.equals("0") && !pPrecioUdKg.equals("0") && !pPrecioUdKg.equals(""))
            {
                AuxString1 = Imp_fijo_oferta;
                AuxString2 = pPrecioUdKg;
                DtoOferta1 = (100 * Float.parseFloat(AuxString1) / Float.parseFloat(AuxString2))+"";
            }
            else
            {
                DtoOferta1 = "0";
            }

            if(!Imp_fijo_Promo.equals("0") && !pPrecioUdKg.equals("0") && !pPrecioUdKg.equals(""))
            {
                AuxString1 = Imp_fijo_Promo;
                AuxString2 = pPrecioUdKg;
                DtoPromo1 = (100 * Float.parseFloat(AuxString1) / Float.parseFloat(AuxString2))+"";
            }
            else
            {
                DtoPromo1 = "0";
            }

            DtoOferta2 = CalcDtoCascada(Dto_oferta);
            DtoPromo2 = CalcDtoCascada(Dto_Promo);
        }
        
        String vLAuxDto1Str ="0";
        String vLAuxDto2Str ="0";
        String vLAuxDto1Dec ="0";
        float vLAuxDto2Dec=0;
        
        vLAuxDto1Str = DtoOferta1;
        vLAuxDto2Str = DtoOferta2;

        vLAuxDto1Dec = vLAuxDto1Str;
        vLAuxDto2Dec = Float.parseFloat(vLAuxDto2Str);
        Porc_Dto_oferta = vLAuxDto1Dec + vLAuxDto2Dec;

        vLAuxDto1Str = DtoPromo1;
        vLAuxDto2Str = DtoPromo2;
       
        vLAuxDto1Dec = vLAuxDto1Str;
        vLAuxDto2Dec = Float.parseFloat(vLAuxDto2Str);
        Porc_Dto_promo = vLAuxDto1Dec + vLAuxDto2Dec;

        if(vLCalcDtoCascada)
        {
            String AuxDto1="0";
            String AuxDto2="0";
            String AuxDtoFin="0";
            AuxDto1 = Modulebase.Redondear(DtoOferta1, 5);
            AuxDto2 = Modulebase.Redondear(DtoOferta2, 5);
            AuxDtoFin = AuxDto1 + "+" + AuxDto2;
            Porc_Dto_oferta = CalcDtoCascada(AuxDtoFin);
        }
        
        if(Float.parseFloat(Porc_Dto_oferta) > 100)
        {
        	Porc_Dto_oferta = "100";
        }
        
        if(Float.parseFloat(Porc_Dto_promo) > 100)
        {
        	Porc_Dto_oferta = 100+"";
        }

        if(vLMetodoCalcDto.equals("Dto. oferta * Dto. promoción * Dto. línea"))
        {
                Dto_linea = AuxDtoLin;
        }
        else if(vLMetodoCalcDto.equals("Dto. oferta + Dto. promoción + Dto. línea"))
        {
                Dto_linea = AuxDtoLin;
        }
    
        CaldDtoFinSegunMetodo();
       
        Porc_Dto_oferta = Modulebase.Redondear(Porc_Dto_oferta, 5);
        Porc_Dto_promo = Modulebase.Redondear(Porc_Dto_promo, 5);
        }
    
    	private void CaldDtoFinSegunMetodo()
    	{
        float vlDto_linea=0;
        float vlDto_oferta=0;
        float vlDto_Promo=0;
        float vLCalcAux=0;
        
        String vLAuxDtoFinal="0";
        String vLMetodoCalcDto = "0";
        boolean vLCalcDtoCascada = false;

        if(!DtoEncontrado)
        {
            GetCamposEnConfigPrev(vLMetodoCalcDto, vLCalcDtoCascada);
        }
        else
        {
            vLMetodoCalcDto = Metodo_calc_dto_linea;
            vLCalcDtoCascada = DtoEnCascada;
        }

        vlDto_linea = Float.parseFloat(Dto_linea);
        vlDto_oferta = Float.parseFloat(Porc_Dto_oferta);
        vlDto_Promo = Float.parseFloat(Porc_Dto_promo);

        if(vLMetodoCalcDto.equals("Dto. oferta * Dto. promoción * Dto. línea"))
        {
                vLCalcAux = 100 - (100 * (1 - vlDto_oferta / 100) * (1 - vlDto_linea / 100) * (1 - vlDto_Promo / 100));
                Dto_Final = vLCalcAux+"";
                Dto_Final = Modulebase.Redondear(Dto_Final, 5);
        }
        else if(vLMetodoCalcDto.equals("Dto. línea * Dto. oferta * Dto. promoción"))
        {
                vLCalcAux = 100 - (100 * (1 - vlDto_linea / 100) * (1 - vlDto_oferta / 100) * (1 - vlDto_Promo / 100));
                Dto_Final = vLCalcAux+"";
                Dto_Final = Modulebase.Redondear(Dto_Final, 5);
        }
        else if(vLMetodoCalcDto.equals("Dto. línea * Dto. oferta + Dto. promoción"))
        {
                vLCalcAux = 100 - (100 * (1 - vlDto_linea / 100) * (1 - vlDto_oferta / 100));
                Dto_Final = vLCalcAux+"";
                Dto_Final = Modulebase.Redondear(Dto_Final, 5);
                vLAuxDtoFinal = Dto_Final;
                vLCalcAux = Float.parseFloat(vLAuxDtoFinal) + vlDto_Promo;
                Dto_Final = Modulebase.Redondear(vLCalcAux+"", 5);
        }
        else if(vLMetodoCalcDto.equals("Dto. línea + Dto. oferta + Dto. promoción") || vLMetodoCalcDto.equals("Dto. oferta + Dto. promoción + Dto. línea"))
        {
        	vLCalcAux = vlDto_linea + vlDto_oferta + vlDto_Promo;
            Dto_Final = Modulebase.Redondear(vLCalcAux+"", 5);
         }
         else if(vLMetodoCalcDto.equals("Dto. línea + Dto. oferta * Dto. promoción"))
         {
                Dto_Final = 100 - (100 * (1 - vlDto_oferta / 100) * (1 - vlDto_Promo / 100))+"";
                Dto_Final = Modulebase.Redondear(Dto_Final, 5);
                vLAuxDtoFinal = Dto_Final;
                vLCalcAux = Float.parseFloat(vLAuxDtoFinal) + vlDto_linea;
                Dto_Final = Modulebase.Redondear(vLCalcAux+"", 5);
         }
    }
    
    public String CalcDtoCascada(String pTextoDto)
    {
        int Signo;
        float ValorDto;
        float Descuento=0;
        String Dto="0";

        pTextoDto.replace(" .", "");

        Signo = 1;
        for(int i=0;i<pTextoDto.length();i++)
        {
        	if(pTextoDto.substring(i, 1).equals("+") || (pTextoDto.substring(i, 1).equals("-")))
        	{
                ValorDto = Float.parseFloat(Dto);
                Descuento = Descuento + (Signo * ValorDto) - (Signo * ((Descuento * ValorDto) / 100));
                Dto = "";
                Signo = +1;
                if(pTextoDto.substring(i, 1).equals("-"))
                {
                	Signo = -1;
                }
        	}
        	else
        	{
                if(i==pTextoDto.length()-1)
                {
                    Dto = Dto + pTextoDto.substring(i, 1);
                    ValorDto = Float.parseFloat(Dto);
                    Descuento = Descuento + (Signo * ValorDto) - (Signo * ((Descuento * ValorDto) / 100));
                    Dto = "0";
                }
                else
                {
                    Dto = Dto + pTextoDto.substring(i, 1);
                }
        	}
        }

        return Descuento+"";
        }
        
    private void GetCamposEnConfigPrev(String MetodoCalculo,boolean DtoEnCascada)
    {
    	c = Modulebase.db.ejecutarSelect(new String[]{"Metodo_calc_dto_linea","Dto2_En_cascada"}, "Config_preventas", null, null);

        if(c!=null && c.moveToFirst())
        {
                MetodoCalculo = c.getString(0);
                DtoEnCascada =Integer.parseInt(c.getString(1))!= 0;
        }
        else
        {
                MetodoCalculo = "";
                DtoEnCascada = false;
        }

    }
    
}